Micron Document
πŸŽ–οΈGitΠ―Ρ€Π°πŸŽ–οΈ


Displaying Raw β€’ Download

core/takserver/src/commonMain/kotlin/org/meshtastic/core/takserver/TakV2Compressor.kt f0f2e4449fa977743d89a6cd247394a70f90da04 (f0f2e444) Text, 27.50 KB

T8b949e/*
* Copyright (c) 2026 Meshtastic LLC
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
Tff7b72package T7ee787org.meshtastic.core.takserver

Tff7b72import T7ee787okio.ByteString.Companion.toByteString
Tff7b72import T7ee787org.meshtastic.proto.TAKPacketV2
Tff7b72import T7ee787org.meshtastic.tak.CotXmlBuilder
Tff7b72import T7ee787org.meshtastic.tak.TakPacketV2Data
Tff7b72import T7ee787org.meshtastic.proto.AircraftTrack Tff7b72as Te6edf3WireAircraftTrack
Tff7b72import T7ee787org.meshtastic.proto.CasevacReport Tff7b72as Te6edf3WireCasevacReport
Tff7b72import T7ee787org.meshtastic.proto.CotGeoPoint Tff7b72as Te6edf3WireCotGeoPoint
Tff7b72import T7ee787org.meshtastic.proto.DrawnShape Tff7b72as Te6edf3WireDrawnShape
Tff7b72import T7ee787org.meshtastic.proto.EmergencyAlert Tff7b72as Te6edf3WireEmergencyAlert
Tff7b72import T7ee787org.meshtastic.proto.GeoChat Tff7b72as Te6edf3WireGeoChat
Tff7b72import T7ee787org.meshtastic.proto.Marker Tff7b72as Te6edf3WireMarker
Tff7b72import T7ee787org.meshtastic.proto.RangeAndBearing Tff7b72as Te6edf3WireRangeAndBearing
Tff7b72import T7ee787org.meshtastic.proto.Route Tff7b72as Te6edf3WireRoute
Tff7b72import T7ee787org.meshtastic.proto.TakTalkMessage Tff7b72as Te6edf3WireTakTalkMessage
Tff7b72import T7ee787org.meshtastic.proto.TakTalkRoomData Tff7b72as Te6edf3WireTakTalkRoomData
Tff7b72import T7ee787org.meshtastic.proto.TaskRequest Tff7b72as Te6edf3WireTaskRequest
Tff7b72import T7ee787org.meshtastic.proto.Team Tff7b72as Te6edf3WireTeam
Tff7b72import T7ee787org.meshtastic.tak.TakCompressor Tff7b72as Te6edf3SdkCompressor

T8b949e/**
* TAKPacket V2 wire format compressor/decompressor.
*
* Wire format: [1 byte flags][zstd-compressed TAKPacketV2 protobuf] Flags byte bits 0-5 = dictionary ID, bits 6-7 =
* reserved. Special value 0xFF = uncompressed raw protobuf (from TAK_TRACKER firmware).
*
* Delegates to the TAKPacket-SDK's [SdkCompressor] for zstd dictionary compression. The SDK is multiplatform since
* 0.7.0 and its zstd codec is the transitive pure-Kotlin kzstd, so this runs on every target with no native library.
*/
Tf0883e@SuppressTb4b4b4(
Ta5d6ff"Ta5d6ffCyclomaticComplexMethodTa5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6ffLongMethodTa5d6ff"Tb4b4b4, T8b949e// wireToSdkData and sdkDataToWire are payload mapping switches
Tb4b4b4)
Tff7b72internal Tff7b72object T56d364TakV2Compressor Tb4b4b4{

T8b949e/** Maximum allowed decompressed payload size (bytes). */
Tff7b72const Tff7b72val Te6edf3MAX_DECOMPRESSED_SIZETb4b4b4: Tffa657Int Tff7b72= T79c0ff4T79c0ff0T79c0ff9T79c0ff6

T8b949e/** Dictionary ID for non-aircraft types. */
Tff7b72const Tff7b72val Te6edf3DICT_ID_NON_AIRCRAFTTb4b4b4: Tffa657Int Tff7b72= T79c0ff0

T8b949e/** Dictionary ID for aircraft types. */
Tff7b72const Tff7b72val Te6edf3DICT_ID_AIRCRAFTTb4b4b4: Tffa657Int Tff7b72= T79c0ff1

T8b949e/** Special flags byte value indicating uncompressed raw protobuf. */
Tff7b72const Tff7b72val Te6edf3DICT_ID_UNCOMPRESSEDTb4b4b4: Tffa657Int Tff7b72= T79c0ff0Te6edf3xFF

T8b949e// The SDK compressor bakes in pre-trained zstd dictionaries, so construction is the expensive part β€” build it once,
T8b949e// lazily, on first use.
Tff7b72private Tff7b72val Te6edf3sdkCompressorTb4b4b4: Te6edf3SdkCompressor Tff7b72by Te6edf3lazy Tb4b4b4{ Te6edf3SdkCompressorTb4b4b4(Tb4b4b4) Tb4b4b4}

T8b949e/**
* Compress a TAKPacketV2 into wire payload: [flags byte][zstd compressed protobuf]. Selects dictionary based on the
* CoT type classification.
*/
Tff7b72fun Td2a8ffcompressTb4b4b4(Te6edf3packetTb4b4b4: Te6edf3TAKPacketV2Tb4b4b4)Tb4b4b4: Te6edf3ByteArray Tff7b72= Te6edf3sdkCompressorTb4b4b4.Te6edf3compressTb4b4b4(Te6edf3wireToSdkDataTb4b4b4(Te6edf3packetTb4b4b4)Tb4b4b4)

T8b949e/**
* Decompress a wire payload back to TAKPacketV2. Handles both compressed (dict-based) and uncompressed (0xFF)
* payloads.
*
* @throws IllegalArgumentException if payload is malformed or exceeds size limits.
*/
Tff7b72fun Td2a8ffdecompressTb4b4b4(Te6edf3wirePayloadTb4b4b4: Te6edf3ByteArrayTb4b4b4)Tb4b4b4: Te6edf3TAKPacketV2 Tff7b72= Te6edf3sdkDataToWireTb4b4b4(Te6edf3sdkCompressorTb4b4b4.Te6edf3decompressTb4b4b4(Te6edf3wirePayloadTb4b4b4)Tb4b4b4)

T8b949e/**
* Decompress a V2 wire payload and reconstruct CoT XML via the SDK's [CotXmlBuilder]. This handles ALL payload
* types (DrawnShape, Marker, Route, etc.) without going through the Wire proto intermediate, avoiding the gap where
* `toCoTMessage()` only handles PLI/GeoChat.
*/
Tff7b72fun Td2a8ffdecompressToXmlTb4b4b4(Te6edf3wirePayloadTb4b4b4: Te6edf3ByteArrayTb4b4b4)Tb4b4b4: Tffa657String Tff7b72= Te6edf3CotXmlBuilderTb4b4b4(Tb4b4b4)Tb4b4b4.Te6edf3buildTb4b4b4(Te6edf3sdkCompressorTb4b4b4.Te6edf3decompressTb4b4b4(Te6edf3wirePayloadTb4b4b4)Tb4b4b4)

T8b949e/** Convert Wire-generated TAKPacketV2 β†’ SDK's TakPacketV2Data. */
Tff7b72private Tff7b72fun Td2a8ffwireToSdkDataTb4b4b4(Te6edf3packetTb4b4b4: Te6edf3TAKPacketV2Tb4b4b4)Tb4b4b4: Te6edf3TakPacketV2Data Tb4b4b4{
Tff7b72val Te6edf3cotTypeId Tff7b72= Te6edf3packetTb4b4b4.Te6edf3cot_type_idTb4b4b4.Te6edf3value
Tff7b72val Te6edf3cotTypeStr Tff7b72= Tff7b72if Tb4b4b4(Te6edf3cotTypeId Tff7b72=Tff7b72= T79c0ff0 Tff7b72&Tff7b72& Te6edf3packetTb4b4b4.Te6edf3cot_type_strTb4b4b4.Te6edf3isNotEmptyTb4b4b4(Tb4b4b4)Tb4b4b4) Te6edf3packetTb4b4b4.Te6edf3cot_type_str Tff7b72else Tff7b72null

Tff7b72val Te6edf3payload Tff7b72=
Tff7b72when Tb4b4b4{
Te6edf3packetTb4b4b4.Te6edf3chat Tff7b72!Tff7b72= Tff7b72null Tff7b72-Tff7b72>
Te6edf3TakPacketV2DataTb4b4b4.Te6edf3PayloadTb4b4b4.Te6edf3ChatTb4b4b4(
Te6edf3message Tff7b72= Te6edf3packetTb4b4b4.Te6edf3chatTff7b72!!Tb4b4b4.Te6edf3messageTb4b4b4,
Te6edf3to Tff7b72= Te6edf3packetTb4b4b4.Te6edf3chatTff7b72!!Tb4b4b4.Te6edf3toTb4b4b4,
Te6edf3toCallsign Tff7b72= Te6edf3packetTb4b4b4.Te6edf3chatTff7b72!!Tb4b4b4.Te6edf3to_callsignTb4b4b4,
Te6edf3receiptForUid Tff7b72= Te6edf3packetTb4b4b4.Te6edf3chatTff7b72!!Tb4b4b4.Te6edf3receipt_for_uidTb4b4b4,
Te6edf3receiptType Tff7b72= Te6edf3packetTb4b4b4.Te6edf3chatTff7b72!!Tb4b4b4.Te6edf3receipt_typeTb4b4b4.Te6edf3valueTb4b4b4,
T8b949e// TAKTALK sidecars (proto3 optional β†’ wire nullable).
T8b949e// Empty string = empty `<Ea/>` / `<roomId/>` in source XML;
T8b949e// null on the wire = field absent. The SDK's Chat data class
T8b949e// uses "" for absent, so map null β†’ "". voice_profile_id has
T8b949e// a present-vs-empty-marker distinction tracked separately
T8b949e// via hasVoiceProfile.
Te6edf3lang Tff7b72= Te6edf3packetTb4b4b4.Te6edf3chatTff7b72!!Tb4b4b4.Te6edf3lang Tff7b72?: Ta5d6ff"Ta5d6ff"Tb4b4b4,
Te6edf3roomId Tff7b72= Te6edf3packetTb4b4b4.Te6edf3chatTff7b72!!Tb4b4b4.Te6edf3room_id Tff7b72?: Ta5d6ff"Ta5d6ff"Tb4b4b4,
Te6edf3voiceProfileId Tff7b72= Te6edf3packetTb4b4b4.Te6edf3chatTff7b72!!Tb4b4b4.Te6edf3voice_profile_id Tff7b72?: Ta5d6ff"Ta5d6ff"Tb4b4b4,
Te6edf3hasVoiceProfile Tff7b72= Te6edf3packetTb4b4b4.Te6edf3chatTff7b72!!Tb4b4b4.Te6edf3voice_profile_id Tff7b72!Tff7b72= Tff7b72nullTb4b4b4,
Tb4b4b4)

T8b949e// TAKTALK voice/text message (m-t-t). Without this branch,
T8b949e// m-t-t events fall through to Payload.None and the receiver
T8b949e// can't rebuild the CoT event, so TTS playback never fires.
Te6edf3packetTb4b4b4.Te6edf3taktalk Tff7b72!Tff7b72= Tff7b72null Tff7b72-Tff7b72>
Te6edf3TakPacketV2DataTb4b4b4.Te6edf3PayloadTb4b4b4.Te6edf3TakTalkTb4b4b4(
Te6edf3text Tff7b72= Te6edf3packetTb4b4b4.Te6edf3taktalkTff7b72!!Tb4b4b4.Te6edf3textTb4b4b4,
Te6edf3chatroomId Tff7b72= Te6edf3packetTb4b4b4.Te6edf3taktalkTff7b72!!Tb4b4b4.Te6edf3chatroom_idTb4b4b4,
Te6edf3lang Tff7b72= Te6edf3packetTb4b4b4.Te6edf3taktalkTff7b72!!Tb4b4b4.Te6edf3langTb4b4b4,
Te6edf3fromVoice Tff7b72= Te6edf3packetTb4b4b4.Te6edf3taktalkTff7b72!!Tb4b4b4.Te6edf3from_voiceTb4b4b4,
Tb4b4b4)

T8b949e// TAKTALK room/membership broadcast (y-).
Te6edf3packetTb4b4b4.Te6edf3taktalk_room Tff7b72!Tff7b72= Tff7b72null Tff7b72-Tff7b72>
Te6edf3TakPacketV2DataTb4b4b4.Te6edf3PayloadTb4b4b4.Te6edf3TakTalkRoomTb4b4b4(
Te6edf3roomId Tff7b72= Te6edf3packetTb4b4b4.Te6edf3taktalk_roomTff7b72!!Tb4b4b4.Te6edf3room_idTb4b4b4,
Te6edf3roomName Tff7b72= Te6edf3packetTb4b4b4.Te6edf3taktalk_roomTff7b72!!Tb4b4b4.Te6edf3room_nameTb4b4b4,
Te6edf3participants Tff7b72= Te6edf3packetTb4b4b4.Te6edf3taktalk_roomTff7b72!!Tb4b4b4.Te6edf3participantsTb4b4b4.Te6edf3toListTb4b4b4(Tb4b4b4)Tb4b4b4,
Tb4b4b4)

Te6edf3packetTb4b4b4.Te6edf3aircraft Tff7b72!Tff7b72= Tff7b72null Tff7b72-Tff7b72>
Te6edf3TakPacketV2DataTb4b4b4.Te6edf3PayloadTb4b4b4.Te6edf3AircraftTb4b4b4(
Te6edf3icao Tff7b72= Te6edf3packetTb4b4b4.Te6edf3aircraftTff7b72!!Tb4b4b4.Te6edf3icaoTb4b4b4,
Te6edf3registration Tff7b72= Te6edf3packetTb4b4b4.Te6edf3aircraftTff7b72!!Tb4b4b4.Te6edf3registrationTb4b4b4,
Te6edf3flight Tff7b72= Te6edf3packetTb4b4b4.Te6edf3aircraftTff7b72!!Tb4b4b4.Te6edf3flightTb4b4b4,
Te6edf3aircraftType Tff7b72= Te6edf3packetTb4b4b4.Te6edf3aircraftTff7b72!!Tb4b4b4.Te6edf3aircraft_typeTb4b4b4,
Te6edf3squawk Tff7b72= Te6edf3packetTb4b4b4.Te6edf3aircraftTff7b72!!Tb4b4b4.Te6edf3squawkTb4b4b4,
Te6edf3category Tff7b72= Te6edf3packetTb4b4b4.Te6edf3aircraftTff7b72!!Tb4b4b4.Te6edf3categoryTb4b4b4,
Te6edf3rssiX10 Tff7b72= Te6edf3packetTb4b4b4.Te6edf3aircraftTff7b72!!Tb4b4b4.Te6edf3rssi_x10Tb4b4b4,
Te6edf3gps Tff7b72= Te6edf3packetTb4b4b4.Te6edf3aircraftTff7b72!!Tb4b4b4.Te6edf3gpsTb4b4b4,
Te6edf3cotHostId Tff7b72= Te6edf3packetTb4b4b4.Te6edf3aircraftTff7b72!!Tb4b4b4.Te6edf3cot_host_idTb4b4b4,
Tb4b4b4)

T8b949e// Typed geometry variants added by takv2_geometry (tags 34-37).
T8b949e// All GeoPoint fields on the wire are delta-encoded from the
T8b949e// event anchor; the SDK data class stores absolute lat/lon, so
T8b949e// we add packet.latitude_i / longitude_i here.
Te6edf3packetTb4b4b4.Te6edf3shape Tff7b72!Tff7b72= Tff7b72null Tff7b72-Tff7b72> Tb4b4b4{
Tff7b72val Te6edf3s Tff7b72= Te6edf3packetTb4b4b4.Te6edf3shapeTff7b72!!
Te6edf3TakPacketV2DataTb4b4b4.Te6edf3PayloadTb4b4b4.Te6edf3DrawnShapeTb4b4b4(
Te6edf3kind Tff7b72= Te6edf3sTb4b4b4.Te6edf3kindTb4b4b4.Te6edf3valueTb4b4b4,
Te6edf3style Tff7b72= Te6edf3sTb4b4b4.Te6edf3styleTb4b4b4.Te6edf3valueTb4b4b4,
Te6edf3majorCm Tff7b72= Te6edf3sTb4b4b4.Te6edf3major_cmTb4b4b4,
Te6edf3minorCm Tff7b72= Te6edf3sTb4b4b4.Te6edf3minor_cmTb4b4b4,
Te6edf3angleDeg Tff7b72= Te6edf3sTb4b4b4.Te6edf3angle_degTb4b4b4,
Te6edf3strokeColor Tff7b72= Te6edf3sTb4b4b4.Te6edf3stroke_colorTb4b4b4.Te6edf3valueTb4b4b4,
Te6edf3strokeArgb Tff7b72= Te6edf3sTb4b4b4.Te6edf3stroke_argbTb4b4b4,
Te6edf3strokeWeightX10 Tff7b72= Te6edf3sTb4b4b4.Te6edf3stroke_weight_x10Tb4b4b4,
Te6edf3fillColor Tff7b72= Te6edf3sTb4b4b4.Te6edf3fill_colorTb4b4b4.Te6edf3valueTb4b4b4,
Te6edf3fillArgb Tff7b72= Te6edf3sTb4b4b4.Te6edf3fill_argbTb4b4b4,
Te6edf3labelsOn Tff7b72= Te6edf3sTb4b4b4.Te6edf3labels_onTb4b4b4,
T8b949e// v0.4.0: vertices are two packed sint32 delta columns
T8b949e// (vertex_lat_deltas / vertex_lon_deltas), zigzag deltas
T8b949e// from the event anchor; SDK data stores absolute lat/lon.
Te6edf3vertices Tff7b72=
Te6edf3sTb4b4b4.Te6edf3vertex_lat_deltasTb4b4b4.Te6edf3zipTb4b4b4(Te6edf3sTb4b4b4.Te6edf3vertex_lon_deltasTb4b4b4) Tb4b4b4{ Te6edf3latDTb4b4b4, Te6edf3lonD Tff7b72-Tff7b72>
Te6edf3TakPacketV2DataTb4b4b4.Te6edf3PayloadTb4b4b4.Te6edf3VertexTb4b4b4(
Te6edf3latI Tff7b72= Te6edf3packetTb4b4b4.Te6edf3latitude_i Tff7b72+ Te6edf3latDTb4b4b4,
Te6edf3lonI Tff7b72= Te6edf3packetTb4b4b4.Te6edf3longitude_i Tff7b72+ Te6edf3lonDTb4b4b4,
Tb4b4b4)
Tb4b4b4}Tb4b4b4,
Te6edf3truncated Tff7b72= Te6edf3sTb4b4b4.Te6edf3truncatedTb4b4b4,
Te6edf3bullseyeDistanceDm Tff7b72= Te6edf3sTb4b4b4.Te6edf3bullseye_distance_dmTb4b4b4,
Te6edf3bullseyeBearingRef Tff7b72= Te6edf3sTb4b4b4.Te6edf3bullseye_bearing_refTb4b4b4,
Te6edf3bullseyeFlags Tff7b72= Te6edf3sTb4b4b4.Te6edf3bullseye_flagsTb4b4b4,
Te6edf3bullseyeUidRef Tff7b72= Te6edf3sTb4b4b4.Te6edf3bullseye_uid_refTb4b4b4,
Tb4b4b4)
Tb4b4b4}

Te6edf3packetTb4b4b4.Te6edf3marker Tff7b72!Tff7b72= Tff7b72null Tff7b72-Tff7b72> Tb4b4b4{
Tff7b72val Te6edf3m Tff7b72= Te6edf3packetTb4b4b4.Te6edf3markerTff7b72!!
Te6edf3TakPacketV2DataTb4b4b4.Te6edf3PayloadTb4b4b4.Te6edf3MarkerTb4b4b4(
Te6edf3kind Tff7b72= Te6edf3mTb4b4b4.Te6edf3kindTb4b4b4.Te6edf3valueTb4b4b4,
Te6edf3color Tff7b72= Te6edf3mTb4b4b4.Te6edf3colorTb4b4b4.Te6edf3valueTb4b4b4,
Te6edf3colorArgb Tff7b72= Te6edf3mTb4b4b4.Te6edf3color_argbTb4b4b4,
Te6edf3readiness Tff7b72= Te6edf3mTb4b4b4.Te6edf3readinessTb4b4b4,
Te6edf3parentUid Tff7b72= Te6edf3mTb4b4b4.Te6edf3parent_uidTb4b4b4,
Te6edf3parentType Tff7b72= Te6edf3mTb4b4b4.Te6edf3parent_typeTb4b4b4,
Te6edf3parentCallsign Tff7b72= Te6edf3mTb4b4b4.Te6edf3parent_callsignTb4b4b4,
Te6edf3iconset Tff7b72= Te6edf3mTb4b4b4.Te6edf3iconsetTb4b4b4,
Tb4b4b4)
Tb4b4b4}

Te6edf3packetTb4b4b4.Te6edf3rab Tff7b72!Tff7b72= Tff7b72null Tff7b72-Tff7b72> Tb4b4b4{
Tff7b72val Te6edf3r Tff7b72= Te6edf3packetTb4b4b4.Te6edf3rabTff7b72!!
Tff7b72val Te6edf3anchor Tff7b72= Te6edf3rTb4b4b4.Te6edf3anchor
Te6edf3TakPacketV2DataTb4b4b4.Te6edf3PayloadTb4b4b4.Te6edf3RangeAndBearingTb4b4b4(
Te6edf3anchorLatI Tff7b72= Te6edf3packetTb4b4b4.Te6edf3latitude_i Tff7b72+ Tb4b4b4(Te6edf3anchorTff7b72?.Te6edf3lat_delta_i Tff7b72?: T79c0ff0Tb4b4b4)Tb4b4b4,
Te6edf3anchorLonI Tff7b72= Te6edf3packetTb4b4b4.Te6edf3longitude_i Tff7b72+ Tb4b4b4(Te6edf3anchorTff7b72?.Te6edf3lon_delta_i Tff7b72?: T79c0ff0Tb4b4b4)Tb4b4b4,
Te6edf3anchorUid Tff7b72= Te6edf3rTb4b4b4.Te6edf3anchor_uidTb4b4b4,
Te6edf3rangeCm Tff7b72= Te6edf3rTb4b4b4.Te6edf3range_cmTb4b4b4,
Te6edf3bearingCdeg Tff7b72= Te6edf3rTb4b4b4.Te6edf3bearing_cdegTb4b4b4,
Te6edf3strokeColor Tff7b72= Te6edf3rTb4b4b4.Te6edf3stroke_colorTb4b4b4.Te6edf3valueTb4b4b4,
Te6edf3strokeArgb Tff7b72= Te6edf3rTb4b4b4.Te6edf3stroke_argbTb4b4b4,
Te6edf3strokeWeightX10 Tff7b72= Te6edf3rTb4b4b4.Te6edf3stroke_weight_x10Tb4b4b4,
Tb4b4b4)
Tb4b4b4}

Te6edf3packetTb4b4b4.Te6edf3route Tff7b72!Tff7b72= Tff7b72null Tff7b72-Tff7b72> Tb4b4b4{
Tff7b72val Te6edf3rt Tff7b72= Te6edf3packetTb4b4b4.Te6edf3routeTff7b72!!
Te6edf3TakPacketV2DataTb4b4b4.Te6edf3PayloadTb4b4b4.Te6edf3RouteTb4b4b4(
Te6edf3method Tff7b72= Te6edf3rtTb4b4b4.Te6edf3methodTb4b4b4.Te6edf3valueTb4b4b4,
Te6edf3direction Tff7b72= Te6edf3rtTb4b4b4.Te6edf3directionTb4b4b4.Te6edf3valueTb4b4b4,
Te6edf3prefix Tff7b72= Te6edf3rtTb4b4b4.Te6edf3prefixTb4b4b4,
Te6edf3strokeWeightX10 Tff7b72= Te6edf3rtTb4b4b4.Te6edf3stroke_weight_x10Tb4b4b4,
Te6edf3links Tff7b72=
Te6edf3rtTb4b4b4.Te6edf3linksTb4b4b4.Te6edf3map Tb4b4b4{ Te6edf3link Tff7b72-Tff7b72>
Tff7b72val Te6edf3pt Tff7b72= Te6edf3linkTb4b4b4.Te6edf3point
Te6edf3TakPacketV2DataTb4b4b4.Te6edf3PayloadTb4b4b4.Te6edf3RouteTb4b4b4.Te6edf3LinkTb4b4b4(
Te6edf3latI Tff7b72= Te6edf3packetTb4b4b4.Te6edf3latitude_i Tff7b72+ Tb4b4b4(Te6edf3ptTff7b72?.Te6edf3lat_delta_i Tff7b72?: T79c0ff0Tb4b4b4)Tb4b4b4,
Te6edf3lonI Tff7b72= Te6edf3packetTb4b4b4.Te6edf3longitude_i Tff7b72+ Tb4b4b4(Te6edf3ptTff7b72?.Te6edf3lon_delta_i Tff7b72?: T79c0ff0Tb4b4b4)Tb4b4b4,
Te6edf3uid Tff7b72= Te6edf3linkTb4b4b4.Te6edf3uidTb4b4b4,
Te6edf3callsign Tff7b72= Te6edf3linkTb4b4b4.Te6edf3callsignTb4b4b4,
Te6edf3linkType Tff7b72= Te6edf3linkTb4b4b4.Te6edf3link_typeTb4b4b4,
Tb4b4b4)
Tb4b4b4}Tb4b4b4,
Te6edf3truncated Tff7b72= Te6edf3rtTb4b4b4.Te6edf3truncatedTb4b4b4,
Tb4b4b4)
Tb4b4b4}

Te6edf3packetTb4b4b4.Te6edf3casevac Tff7b72!Tff7b72= Tff7b72null Tff7b72-Tff7b72> Tb4b4b4{
Tff7b72val Te6edf3c Tff7b72= Te6edf3packetTb4b4b4.Te6edf3casevacTff7b72!!
Te6edf3TakPacketV2DataTb4b4b4.Te6edf3PayloadTb4b4b4.Te6edf3CasevacReportTb4b4b4(
Te6edf3precedence Tff7b72= Te6edf3cTb4b4b4.Te6edf3precedenceTb4b4b4.Te6edf3valueTb4b4b4,
Te6edf3equipmentFlags Tff7b72= Te6edf3cTb4b4b4.Te6edf3equipment_flagsTb4b4b4,
Te6edf3litterPatients Tff7b72= Te6edf3cTb4b4b4.Te6edf3litter_patientsTb4b4b4,
Te6edf3ambulatoryPatients Tff7b72= Te6edf3cTb4b4b4.Te6edf3ambulatory_patientsTb4b4b4,
Te6edf3security Tff7b72= Te6edf3cTb4b4b4.Te6edf3securityTb4b4b4.Te6edf3valueTb4b4b4,
Te6edf3hlzMarking Tff7b72= Te6edf3cTb4b4b4.Te6edf3hlz_markingTb4b4b4.Te6edf3valueTb4b4b4,
Te6edf3zoneMarker Tff7b72= Te6edf3cTb4b4b4.Te6edf3zone_markerTb4b4b4,
Te6edf3usMilitary Tff7b72= Te6edf3cTb4b4b4.Te6edf3us_militaryTb4b4b4,
Te6edf3usCivilian Tff7b72= Te6edf3cTb4b4b4.Te6edf3us_civilianTb4b4b4,
Te6edf3nonUsMilitary Tff7b72= Te6edf3cTb4b4b4.Te6edf3non_us_militaryTb4b4b4,
Te6edf3nonUsCivilian Tff7b72= Te6edf3cTb4b4b4.Te6edf3non_us_civilianTb4b4b4,
Te6edf3epw Tff7b72= Te6edf3cTb4b4b4.Te6edf3epwTb4b4b4,
Te6edf3child Tff7b72= Te6edf3cTb4b4b4.Te6edf3childTb4b4b4,
Te6edf3terrainFlags Tff7b72= Te6edf3cTb4b4b4.Te6edf3terrain_flagsTb4b4b4,
Te6edf3frequency Tff7b72= Te6edf3cTb4b4b4.Te6edf3frequencyTb4b4b4,
Tb4b4b4)
Tb4b4b4}

Te6edf3packetTb4b4b4.Te6edf3emergency Tff7b72!Tff7b72= Tff7b72null Tff7b72-Tff7b72> Tb4b4b4{
Tff7b72val Te6edf3e Tff7b72= Te6edf3packetTb4b4b4.Te6edf3emergencyTff7b72!!
Te6edf3TakPacketV2DataTb4b4b4.Te6edf3PayloadTb4b4b4.Te6edf3EmergencyAlertTb4b4b4(
Te6edf3type Tff7b72= Te6edf3eTb4b4b4.Te6edf3typeTb4b4b4.Te6edf3valueTb4b4b4,
Te6edf3authoringUid Tff7b72= Te6edf3eTb4b4b4.Te6edf3authoring_uidTb4b4b4,
Te6edf3cancelReferenceUid Tff7b72= Te6edf3eTb4b4b4.Te6edf3cancel_reference_uidTb4b4b4,
Tb4b4b4)
Tb4b4b4}

Te6edf3packetTb4b4b4.Te6edf3task Tff7b72!Tff7b72= Tff7b72null Tff7b72-Tff7b72> Tb4b4b4{
Tff7b72val Te6edf3t Tff7b72= Te6edf3packetTb4b4b4.Te6edf3taskTff7b72!!
Te6edf3TakPacketV2DataTb4b4b4.Te6edf3PayloadTb4b4b4.Te6edf3TaskRequestTb4b4b4(
Te6edf3taskType Tff7b72= Te6edf3tTb4b4b4.Te6edf3task_typeTb4b4b4,
Te6edf3targetUid Tff7b72= Te6edf3tTb4b4b4.Te6edf3target_uidTb4b4b4,
Te6edf3assigneeUid Tff7b72= Te6edf3tTb4b4b4.Te6edf3assignee_uidTb4b4b4,
Te6edf3priority Tff7b72= Te6edf3tTb4b4b4.Te6edf3priorityTb4b4b4.Te6edf3valueTb4b4b4,
Te6edf3status Tff7b72= Te6edf3tTb4b4b4.Te6edf3statusTb4b4b4.Te6edf3valueTb4b4b4,
Te6edf3note Tff7b72= Te6edf3tTb4b4b4.Te6edf3noteTb4b4b4,
Tb4b4b4)
Tb4b4b4}

Te6edf3packetTb4b4b4.Te6edf3raw_detail Tff7b72!Tff7b72= Tff7b72null Tff7b72-Tff7b72> Te6edf3TakPacketV2DataTb4b4b4.Te6edf3PayloadTb4b4b4.Te6edf3RawDetailTb4b4b4(Te6edf3packetTb4b4b4.Te6edf3raw_detailTff7b72!!Tb4b4b4.Te6edf3toByteArrayTb4b4b4(Tb4b4b4)Tb4b4b4)

T8b949e// v0.4.0: PLI is implicit β€” a packet with no payload_variant set
T8b949e// is a position report (the bool pli oneof arm was removed).
T8b949e// Mirrors the SDK serializer's toData default.
Tff7b72else Tff7b72-Tff7b72> Te6edf3TakPacketV2DataTb4b4b4.Te6edf3PayloadTb4b4b4.Te6edf3PliTb4b4b4(Tff7b72trueTb4b4b4)
Tb4b4b4}

Tff7b72return Te6edf3TakPacketV2DataTb4b4b4(
Te6edf3cotTypeId Tff7b72= Te6edf3cotTypeIdTb4b4b4,
Te6edf3cotTypeStr Tff7b72= Te6edf3cotTypeStrTb4b4b4,
Te6edf3how Tff7b72= Te6edf3packetTb4b4b4.Te6edf3howTb4b4b4.Te6edf3valueTb4b4b4,
Te6edf3callsign Tff7b72= Te6edf3packetTb4b4b4.Te6edf3callsignTb4b4b4,
Te6edf3team Tff7b72= Te6edf3packetTb4b4b4.Te6edf3teamTb4b4b4.Te6edf3valueTb4b4b4,
Te6edf3role Tff7b72= Te6edf3packetTb4b4b4.Te6edf3roleTb4b4b4.Te6edf3valueTb4b4b4,
Te6edf3latitudeI Tff7b72= Te6edf3packetTb4b4b4.Te6edf3latitude_iTb4b4b4,
Te6edf3longitudeI Tff7b72= Te6edf3packetTb4b4b4.Te6edf3longitude_iTb4b4b4,
Te6edf3altitude Tff7b72= Te6edf3packetTb4b4b4.Te6edf3altitudeTb4b4b4,
Te6edf3speed Tff7b72= Te6edf3packetTb4b4b4.Te6edf3speedTb4b4b4,
Te6edf3course Tff7b72= Te6edf3packetTb4b4b4.Te6edf3courseTb4b4b4,
Te6edf3battery Tff7b72= Te6edf3packetTb4b4b4.Te6edf3batteryTb4b4b4,
Te6edf3geoSrc Tff7b72= Te6edf3packetTb4b4b4.Te6edf3geo_srcTb4b4b4.Te6edf3valueTb4b4b4,
Te6edf3altSrc Tff7b72= Te6edf3packetTb4b4b4.Te6edf3alt_srcTb4b4b4.Te6edf3valueTb4b4b4,
Te6edf3uid Tff7b72= Te6edf3packetTb4b4b4.Te6edf3uidTb4b4b4,
Te6edf3deviceCallsign Tff7b72= Te6edf3packetTb4b4b4.Te6edf3device_callsignTb4b4b4,
Te6edf3staleSeconds Tff7b72= Te6edf3packetTb4b4b4.Te6edf3stale_secondsTb4b4b4,
Te6edf3takVersion Tff7b72= Te6edf3packetTb4b4b4.Te6edf3tak_versionTb4b4b4,
Te6edf3takDevice Tff7b72= Te6edf3packetTb4b4b4.Te6edf3tak_deviceTb4b4b4,
Te6edf3takPlatform Tff7b72= Te6edf3packetTb4b4b4.Te6edf3tak_platformTb4b4b4,
Te6edf3takOs Tff7b72= Te6edf3packetTb4b4b4.Te6edf3tak_osTb4b4b4,
Te6edf3endpoint Tff7b72= Te6edf3packetTb4b4b4.Te6edf3endpointTb4b4b4,
Te6edf3phone Tff7b72= Te6edf3packetTb4b4b4.Te6edf3phoneTb4b4b4,
T8b949e// Directed-routing recipient callsigns (<marti><dest …/>…</marti>).
T8b949e// Empty list = broadcast (default); populated for TAKTALK m-t-t,
T8b949e// directed b-t-f DMs, and any other CoT shape that ATAK addresses
T8b949e// to specific peers. Without this field the receive-side rebuild
T8b949e// drops <marti>, breaking TAKTALK voice TTS.
Te6edf3marti Tff7b72= Te6edf3packetTb4b4b4.Te6edf3martiTff7b72?.Te6edf3dest_callsignTff7b72?.Te6edf3toListTb4b4b4(Tb4b4b4) Tff7b72?: Te6edf3emptyListTb4b4b4(Tb4b4b4)Tb4b4b4,
Te6edf3payload Tff7b72= Te6edf3payloadTb4b4b4,
Tb4b4b4)
Tb4b4b4}

T8b949e/** Convert SDK's TakPacketV2Data β†’ Wire-generated TAKPacketV2. */
Tff7b72private Tff7b72fun Td2a8ffsdkDataToWireTb4b4b4(Te6edf3dataTb4b4b4: Te6edf3TakPacketV2DataTb4b4b4)Tb4b4b4: Te6edf3TAKPacketV2 Tb4b4b4{
Tff7b72val Te6edf3cotType Tff7b72=
Te6edf3orgTb4b4b4.Te6edf3meshtasticTb4b4b4.Te6edf3protoTb4b4b4.Te6edf3CotTypeTb4b4b4.Te6edf3fromValueTb4b4b4(Te6edf3dataTb4b4b4.Te6edf3cotTypeIdTb4b4b4) Tff7b72?: Te6edf3orgTb4b4b4.Te6edf3meshtasticTb4b4b4.Te6edf3protoTb4b4b4.Te6edf3CotTypeTb4b4b4.Te6edf3CotType_Other
Tff7b72val Te6edf3how Tff7b72= Te6edf3orgTb4b4b4.Te6edf3meshtasticTb4b4b4.Te6edf3protoTb4b4b4.Te6edf3CotHowTb4b4b4.Te6edf3fromValueTb4b4b4(Te6edf3dataTb4b4b4.Te6edf3howTb4b4b4) Tff7b72?: Te6edf3orgTb4b4b4.Te6edf3meshtasticTb4b4b4.Te6edf3protoTb4b4b4.Te6edf3CotHowTb4b4b4.Te6edf3CotHow_Unspecified
Tff7b72val Te6edf3team Tff7b72= Te6edf3orgTb4b4b4.Te6edf3meshtasticTb4b4b4.Te6edf3protoTb4b4b4.Te6edf3TeamTb4b4b4.Te6edf3fromValueTb4b4b4(Te6edf3dataTb4b4b4.Te6edf3teamTb4b4b4) Tff7b72?: Te6edf3orgTb4b4b4.Te6edf3meshtasticTb4b4b4.Te6edf3protoTb4b4b4.Te6edf3TeamTb4b4b4.Te6edf3Unspecifed_Color
Tff7b72val Te6edf3role Tff7b72= Te6edf3orgTb4b4b4.Te6edf3meshtasticTb4b4b4.Te6edf3protoTb4b4b4.Te6edf3MemberRoleTb4b4b4.Te6edf3fromValueTb4b4b4(Te6edf3dataTb4b4b4.Te6edf3roleTb4b4b4) Tff7b72?: Te6edf3orgTb4b4b4.Te6edf3meshtasticTb4b4b4.Te6edf3protoTb4b4b4.Te6edf3MemberRoleTb4b4b4.Te6edf3Unspecifed
Tff7b72val Te6edf3geoSrc Tff7b72=
Te6edf3orgTb4b4b4.Te6edf3meshtasticTb4b4b4.Te6edf3protoTb4b4b4.Te6edf3GeoPointSourceTb4b4b4.Te6edf3fromValueTb4b4b4(Te6edf3dataTb4b4b4.Te6edf3geoSrcTb4b4b4)
Tff7b72?: Te6edf3orgTb4b4b4.Te6edf3meshtasticTb4b4b4.Te6edf3protoTb4b4b4.Te6edf3GeoPointSourceTb4b4b4.Te6edf3GeoPointSource_Unspecified
Tff7b72val Te6edf3altSrc Tff7b72=
Te6edf3orgTb4b4b4.Te6edf3meshtasticTb4b4b4.Te6edf3protoTb4b4b4.Te6edf3GeoPointSourceTb4b4b4.Te6edf3fromValueTb4b4b4(Te6edf3dataTb4b4b4.Te6edf3altSrcTb4b4b4)
Tff7b72?: Te6edf3orgTb4b4b4.Te6edf3meshtasticTb4b4b4.Te6edf3protoTb4b4b4.Te6edf3GeoPointSourceTb4b4b4.Te6edf3GeoPointSource_Unspecified

Tff7b72return Te6edf3TAKPacketV2Tb4b4b4(
Te6edf3cot_type_id Tff7b72= Te6edf3cotTypeTb4b4b4,
Te6edf3cot_type_str Tff7b72= Te6edf3dataTb4b4b4.Te6edf3cotTypeStr Tff7b72?: Ta5d6ff"Ta5d6ff"Tb4b4b4,
Te6edf3how Tff7b72= Te6edf3howTb4b4b4,
Te6edf3callsign Tff7b72= Te6edf3dataTb4b4b4.Te6edf3callsignTb4b4b4,
Te6edf3team Tff7b72= Te6edf3teamTb4b4b4,
Te6edf3role Tff7b72= Te6edf3roleTb4b4b4,
Te6edf3latitude_i Tff7b72= Te6edf3dataTb4b4b4.Te6edf3latitudeITb4b4b4,
Te6edf3longitude_i Tff7b72= Te6edf3dataTb4b4b4.Te6edf3longitudeITb4b4b4,
Te6edf3altitude Tff7b72= Te6edf3dataTb4b4b4.Te6edf3altitudeTb4b4b4,
Te6edf3speed Tff7b72= Te6edf3dataTb4b4b4.Te6edf3speedTb4b4b4,
Te6edf3course Tff7b72= Te6edf3dataTb4b4b4.Te6edf3courseTb4b4b4,
Te6edf3battery Tff7b72= Te6edf3dataTb4b4b4.Te6edf3batteryTb4b4b4,
Te6edf3geo_src Tff7b72= Te6edf3geoSrcTb4b4b4,
Te6edf3alt_src Tff7b72= Te6edf3altSrcTb4b4b4,
Te6edf3uid Tff7b72= Te6edf3dataTb4b4b4.Te6edf3uidTb4b4b4,
Te6edf3device_callsign Tff7b72= Te6edf3dataTb4b4b4.Te6edf3deviceCallsignTb4b4b4,
Te6edf3stale_seconds Tff7b72= Te6edf3dataTb4b4b4.Te6edf3staleSecondsTb4b4b4,
Te6edf3tak_version Tff7b72= Te6edf3dataTb4b4b4.Te6edf3takVersionTb4b4b4,
Te6edf3tak_device Tff7b72= Te6edf3dataTb4b4b4.Te6edf3takDeviceTb4b4b4,
Te6edf3tak_platform Tff7b72= Te6edf3dataTb4b4b4.Te6edf3takPlatformTb4b4b4,
Te6edf3tak_os Tff7b72= Te6edf3dataTb4b4b4.Te6edf3takOsTb4b4b4,
Te6edf3endpoint Tff7b72= Te6edf3dataTb4b4b4.Te6edf3endpointTb4b4b4,
Te6edf3phone Tff7b72= Te6edf3dataTb4b4b4.Te6edf3phoneTb4b4b4,
T8b949e// v0.4.0: PLI is implicit β€” no payload_variant is set for a PLI (the
T8b949e// bool pli oneof arm was removed). Pli/None simply set no oneof field.
Te6edf3chat Tff7b72=
Tb4b4b4(Te6edf3dataTb4b4b4.Te6edf3payload Tff7b72as? Te6edf3TakPacketV2DataTb4b4b4.Te6edf3PayloadTb4b4b4.Te6edf3ChatTb4b4b4)Tff7b72?.Te6edf3let Tb4b4b4{ Te6edf3chat Tff7b72-Tff7b72>
Te6edf3WireGeoChatTb4b4b4(
Te6edf3message Tff7b72= Te6edf3chatTb4b4b4.Te6edf3messageTb4b4b4,
Te6edf3to Tff7b72= Te6edf3chatTb4b4b4.Te6edf3toTb4b4b4,
Te6edf3to_callsign Tff7b72= Te6edf3chatTb4b4b4.Te6edf3toCallsignTb4b4b4,
Te6edf3receipt_for_uid Tff7b72= Te6edf3chatTb4b4b4.Te6edf3receiptForUidTb4b4b4,
Te6edf3receipt_type Tff7b72=
Te6edf3WireGeoChatTb4b4b4.Te6edf3ReceiptTypeTb4b4b4.Te6edf3fromValueTb4b4b4(Te6edf3chatTb4b4b4.Te6edf3receiptTypeTb4b4b4)
Tff7b72?: Te6edf3WireGeoChatTb4b4b4.Te6edf3ReceiptTypeTb4b4b4.Te6edf3ReceiptType_NoneTb4b4b4,
T8b949e// TAKTALK sidecars. Empty SDK string β†’ wire null (field absent)
T8b949e// so non-TAKTALK chats don't carry empty sidecar bytes on every
T8b949e// mesh packet. voice_profile_id stays present-but-empty when
T8b949e// hasVoiceProfile=true so the receiver can re-emit `<voice_profile_id/>`.
Te6edf3lang Tff7b72= Te6edf3chatTb4b4b4.Te6edf3langTb4b4b4.Te6edf3ifEmpty Tb4b4b4{ Tff7b72null Tb4b4b4}Tb4b4b4,
Te6edf3room_id Tff7b72= Te6edf3chatTb4b4b4.Te6edf3roomIdTb4b4b4.Te6edf3ifEmpty Tb4b4b4{ Tff7b72null Tb4b4b4}Tb4b4b4,
Te6edf3voice_profile_id Tff7b72= Tff7b72if Tb4b4b4(Te6edf3chatTb4b4b4.Te6edf3hasVoiceProfileTb4b4b4) Te6edf3chatTb4b4b4.Te6edf3voiceProfileId Tff7b72else Tff7b72nullTb4b4b4,
Tb4b4b4)
Tb4b4b4}Tb4b4b4,
Te6edf3aircraft Tff7b72=
Tb4b4b4(Te6edf3dataTb4b4b4.Te6edf3payload Tff7b72as? Te6edf3TakPacketV2DataTb4b4b4.Te6edf3PayloadTb4b4b4.Te6edf3AircraftTb4b4b4)Tff7b72?.Te6edf3let Tb4b4b4{ Te6edf3ac Tff7b72-Tff7b72>
Te6edf3WireAircraftTrackTb4b4b4(
Te6edf3icao Tff7b72= Te6edf3acTb4b4b4.Te6edf3icaoTb4b4b4,
Te6edf3registration Tff7b72= Te6edf3acTb4b4b4.Te6edf3registrationTb4b4b4,
Te6edf3flight Tff7b72= Te6edf3acTb4b4b4.Te6edf3flightTb4b4b4,
Te6edf3aircraft_type Tff7b72= Te6edf3acTb4b4b4.Te6edf3aircraftTypeTb4b4b4,
Te6edf3squawk Tff7b72= Te6edf3acTb4b4b4.Te6edf3squawkTb4b4b4,
Te6edf3category Tff7b72= Te6edf3acTb4b4b4.Te6edf3categoryTb4b4b4,
Te6edf3rssi_x10 Tff7b72= Te6edf3acTb4b4b4.Te6edf3rssiX10Tb4b4b4,
Te6edf3gps Tff7b72= Te6edf3acTb4b4b4.Te6edf3gpsTb4b4b4,
Te6edf3cot_host_id Tff7b72= Te6edf3acTb4b4b4.Te6edf3cotHostIdTb4b4b4,
Tb4b4b4)
Tb4b4b4}Tb4b4b4,
Te6edf3shape Tff7b72=
Tb4b4b4(Te6edf3dataTb4b4b4.Te6edf3payload Tff7b72as? Te6edf3TakPacketV2DataTb4b4b4.Te6edf3PayloadTb4b4b4.Te6edf3DrawnShapeTb4b4b4)Tff7b72?.Te6edf3let Tb4b4b4{ Te6edf3s Tff7b72-Tff7b72>
Te6edf3WireDrawnShapeTb4b4b4(
Te6edf3kind Tff7b72= Te6edf3WireDrawnShapeTb4b4b4.Te6edf3KindTb4b4b4.Te6edf3fromValueTb4b4b4(Te6edf3sTb4b4b4.Te6edf3kindTb4b4b4) Tff7b72?: Te6edf3WireDrawnShapeTb4b4b4.Te6edf3KindTb4b4b4.Te6edf3Kind_UnspecifiedTb4b4b4,
Te6edf3style Tff7b72=
Te6edf3WireDrawnShapeTb4b4b4.Te6edf3StyleModeTb4b4b4.Te6edf3fromValueTb4b4b4(Te6edf3sTb4b4b4.Te6edf3styleTb4b4b4)
Tff7b72?: Te6edf3WireDrawnShapeTb4b4b4.Te6edf3StyleModeTb4b4b4.Te6edf3StyleMode_UnspecifiedTb4b4b4,
Te6edf3major_cm Tff7b72= Te6edf3sTb4b4b4.Te6edf3majorCmTb4b4b4,
Te6edf3minor_cm Tff7b72= Te6edf3sTb4b4b4.Te6edf3minorCmTb4b4b4,
Te6edf3angle_deg Tff7b72= Te6edf3sTb4b4b4.Te6edf3angleDegTb4b4b4,
Te6edf3stroke_color Tff7b72= Te6edf3WireTeamTb4b4b4.Te6edf3fromValueTb4b4b4(Te6edf3sTb4b4b4.Te6edf3strokeColorTb4b4b4) Tff7b72?: Te6edf3WireTeamTb4b4b4.Te6edf3Unspecifed_ColorTb4b4b4,
Te6edf3stroke_argb Tff7b72= Te6edf3sTb4b4b4.Te6edf3strokeArgbTb4b4b4,
Te6edf3stroke_weight_x10 Tff7b72= Te6edf3sTb4b4b4.Te6edf3strokeWeightX10Tb4b4b4,
Te6edf3fill_color Tff7b72= Te6edf3WireTeamTb4b4b4.Te6edf3fromValueTb4b4b4(Te6edf3sTb4b4b4.Te6edf3fillColorTb4b4b4) Tff7b72?: Te6edf3WireTeamTb4b4b4.Te6edf3Unspecifed_ColorTb4b4b4,
Te6edf3fill_argb Tff7b72= Te6edf3sTb4b4b4.Te6edf3fillArgbTb4b4b4,
Te6edf3labels_on Tff7b72= Te6edf3sTb4b4b4.Te6edf3labelsOnTb4b4b4,
T8b949e// v0.4.0: delta-encode vertices into two packed sint32 columns
T8b949e// relative to the event anchor (was repeated CotGeoPoint).
Te6edf3vertex_lat_deltas Tff7b72= Te6edf3sTb4b4b4.Te6edf3verticesTb4b4b4.Te6edf3map Tb4b4b4{ Tffa657itTb4b4b4.Te6edf3latI Tff7b72- Te6edf3dataTb4b4b4.Te6edf3latitudeI Tb4b4b4}Tb4b4b4,
Te6edf3vertex_lon_deltas Tff7b72= Te6edf3sTb4b4b4.Te6edf3verticesTb4b4b4.Te6edf3map Tb4b4b4{ Tffa657itTb4b4b4.Te6edf3lonI Tff7b72- Te6edf3dataTb4b4b4.Te6edf3longitudeI Tb4b4b4}Tb4b4b4,
Te6edf3truncated Tff7b72= Te6edf3sTb4b4b4.Te6edf3truncatedTb4b4b4,
Te6edf3bullseye_distance_dm Tff7b72= Te6edf3sTb4b4b4.Te6edf3bullseyeDistanceDmTb4b4b4,
Te6edf3bullseye_bearing_ref Tff7b72= Te6edf3sTb4b4b4.Te6edf3bullseyeBearingRefTb4b4b4,
Te6edf3bullseye_flags Tff7b72= Te6edf3sTb4b4b4.Te6edf3bullseyeFlagsTb4b4b4,
Te6edf3bullseye_uid_ref Tff7b72= Te6edf3sTb4b4b4.Te6edf3bullseyeUidRefTb4b4b4,
Tb4b4b4)
Tb4b4b4}Tb4b4b4,
Te6edf3marker Tff7b72=
Tb4b4b4(Te6edf3dataTb4b4b4.Te6edf3payload Tff7b72as? Te6edf3TakPacketV2DataTb4b4b4.Te6edf3PayloadTb4b4b4.Te6edf3MarkerTb4b4b4)Tff7b72?.Te6edf3let Tb4b4b4{ Te6edf3m Tff7b72-Tff7b72>
Te6edf3WireMarkerTb4b4b4(
Te6edf3kind Tff7b72= Te6edf3WireMarkerTb4b4b4.Te6edf3KindTb4b4b4.Te6edf3fromValueTb4b4b4(Te6edf3mTb4b4b4.Te6edf3kindTb4b4b4) Tff7b72?: Te6edf3WireMarkerTb4b4b4.Te6edf3KindTb4b4b4.Te6edf3Kind_UnspecifiedTb4b4b4,
Te6edf3color Tff7b72= Te6edf3WireTeamTb4b4b4.Te6edf3fromValueTb4b4b4(Te6edf3mTb4b4b4.Te6edf3colorTb4b4b4) Tff7b72?: Te6edf3WireTeamTb4b4b4.Te6edf3Unspecifed_ColorTb4b4b4,
Te6edf3color_argb Tff7b72= Te6edf3mTb4b4b4.Te6edf3colorArgbTb4b4b4,
Te6edf3readiness Tff7b72= Te6edf3mTb4b4b4.Te6edf3readinessTb4b4b4,
Te6edf3parent_uid Tff7b72= Te6edf3mTb4b4b4.Te6edf3parentUidTb4b4b4,
Te6edf3parent_type Tff7b72= Te6edf3mTb4b4b4.Te6edf3parentTypeTb4b4b4,
Te6edf3parent_callsign Tff7b72= Te6edf3mTb4b4b4.Te6edf3parentCallsignTb4b4b4,
Te6edf3iconset Tff7b72= Te6edf3mTb4b4b4.Te6edf3iconsetTb4b4b4,
Tb4b4b4)
Tb4b4b4}Tb4b4b4,
Te6edf3rab Tff7b72=
Tb4b4b4(Te6edf3dataTb4b4b4.Te6edf3payload Tff7b72as? Te6edf3TakPacketV2DataTb4b4b4.Te6edf3PayloadTb4b4b4.Te6edf3RangeAndBearingTb4b4b4)Tff7b72?.Te6edf3let Tb4b4b4{ Te6edf3r Tff7b72-Tff7b72>
Te6edf3WireRangeAndBearingTb4b4b4(
Te6edf3anchor Tff7b72=
Te6edf3WireCotGeoPointTb4b4b4(
Te6edf3lat_delta_i Tff7b72= Te6edf3rTb4b4b4.Te6edf3anchorLatI Tff7b72- Te6edf3dataTb4b4b4.Te6edf3latitudeITb4b4b4,
Te6edf3lon_delta_i Tff7b72= Te6edf3rTb4b4b4.Te6edf3anchorLonI Tff7b72- Te6edf3dataTb4b4b4.Te6edf3longitudeITb4b4b4,
Tb4b4b4)Tb4b4b4,
Te6edf3anchor_uid Tff7b72= Te6edf3rTb4b4b4.Te6edf3anchorUidTb4b4b4,
Te6edf3range_cm Tff7b72= Te6edf3rTb4b4b4.Te6edf3rangeCmTb4b4b4,
Te6edf3bearing_cdeg Tff7b72= Te6edf3rTb4b4b4.Te6edf3bearingCdegTb4b4b4,
Te6edf3stroke_color Tff7b72= Te6edf3WireTeamTb4b4b4.Te6edf3fromValueTb4b4b4(Te6edf3rTb4b4b4.Te6edf3strokeColorTb4b4b4) Tff7b72?: Te6edf3WireTeamTb4b4b4.Te6edf3Unspecifed_ColorTb4b4b4,
Te6edf3stroke_argb Tff7b72= Te6edf3rTb4b4b4.Te6edf3strokeArgbTb4b4b4,
Te6edf3stroke_weight_x10 Tff7b72= Te6edf3rTb4b4b4.Te6edf3strokeWeightX10Tb4b4b4,
Tb4b4b4)
Tb4b4b4}Tb4b4b4,
Te6edf3route Tff7b72=
Tb4b4b4(Te6edf3dataTb4b4b4.Te6edf3payload Tff7b72as? Te6edf3TakPacketV2DataTb4b4b4.Te6edf3PayloadTb4b4b4.Te6edf3RouteTb4b4b4)Tff7b72?.Te6edf3let Tb4b4b4{ Te6edf3rt Tff7b72-Tff7b72>
Te6edf3WireRouteTb4b4b4(
Te6edf3method Tff7b72= Te6edf3WireRouteTb4b4b4.Te6edf3MethodTb4b4b4.Te6edf3fromValueTb4b4b4(Te6edf3rtTb4b4b4.Te6edf3methodTb4b4b4) Tff7b72?: Te6edf3WireRouteTb4b4b4.Te6edf3MethodTb4b4b4.Te6edf3Method_UnspecifiedTb4b4b4,
Te6edf3direction Tff7b72=
Te6edf3WireRouteTb4b4b4.Te6edf3DirectionTb4b4b4.Te6edf3fromValueTb4b4b4(Te6edf3rtTb4b4b4.Te6edf3directionTb4b4b4) Tff7b72?: Te6edf3WireRouteTb4b4b4.Te6edf3DirectionTb4b4b4.Te6edf3Direction_UnspecifiedTb4b4b4,
Te6edf3prefix Tff7b72= Te6edf3rtTb4b4b4.Te6edf3prefixTb4b4b4,
Te6edf3stroke_weight_x10 Tff7b72= Te6edf3rtTb4b4b4.Te6edf3strokeWeightX10Tb4b4b4,
Te6edf3links Tff7b72=
Te6edf3rtTb4b4b4.Te6edf3linksTb4b4b4.Te6edf3map Tb4b4b4{ Te6edf3link Tff7b72-Tff7b72>
Te6edf3WireRouteTb4b4b4.Te6edf3LinkTb4b4b4(
Te6edf3point Tff7b72=
Te6edf3WireCotGeoPointTb4b4b4(
Te6edf3lat_delta_i Tff7b72= Te6edf3linkTb4b4b4.Te6edf3latI Tff7b72- Te6edf3dataTb4b4b4.Te6edf3latitudeITb4b4b4,
Te6edf3lon_delta_i Tff7b72= Te6edf3linkTb4b4b4.Te6edf3lonI Tff7b72- Te6edf3dataTb4b4b4.Te6edf3longitudeITb4b4b4,
Tb4b4b4)Tb4b4b4,
Te6edf3uid Tff7b72= Te6edf3linkTb4b4b4.Te6edf3uidTb4b4b4,
Te6edf3callsign Tff7b72= Te6edf3linkTb4b4b4.Te6edf3callsignTb4b4b4,
Te6edf3link_type Tff7b72= Te6edf3linkTb4b4b4.Te6edf3linkTypeTb4b4b4,
Tb4b4b4)
Tb4b4b4}Tb4b4b4,
Te6edf3truncated Tff7b72= Te6edf3rtTb4b4b4.Te6edf3truncatedTb4b4b4,
Tb4b4b4)
Tb4b4b4}Tb4b4b4,
Te6edf3casevac Tff7b72=
Tb4b4b4(Te6edf3dataTb4b4b4.Te6edf3payload Tff7b72as? Te6edf3TakPacketV2DataTb4b4b4.Te6edf3PayloadTb4b4b4.Te6edf3CasevacReportTb4b4b4)Tff7b72?.Te6edf3let Tb4b4b4{ Te6edf3c Tff7b72-Tff7b72>
Te6edf3WireCasevacReportTb4b4b4(
Te6edf3precedence Tff7b72=
Te6edf3WireCasevacReportTb4b4b4.Te6edf3PrecedenceTb4b4b4.Te6edf3fromValueTb4b4b4(Te6edf3cTb4b4b4.Te6edf3precedenceTb4b4b4)
Tff7b72?: Te6edf3WireCasevacReportTb4b4b4.Te6edf3PrecedenceTb4b4b4.Te6edf3Precedence_UnspecifiedTb4b4b4,
Te6edf3equipment_flags Tff7b72= Te6edf3cTb4b4b4.Te6edf3equipmentFlagsTb4b4b4,
Te6edf3litter_patients Tff7b72= Te6edf3cTb4b4b4.Te6edf3litterPatientsTb4b4b4,
Te6edf3ambulatory_patients Tff7b72= Te6edf3cTb4b4b4.Te6edf3ambulatoryPatientsTb4b4b4,
Te6edf3security Tff7b72=
Te6edf3WireCasevacReportTb4b4b4.Te6edf3SecurityTb4b4b4.Te6edf3fromValueTb4b4b4(Te6edf3cTb4b4b4.Te6edf3securityTb4b4b4)
Tff7b72?: Te6edf3WireCasevacReportTb4b4b4.Te6edf3SecurityTb4b4b4.Te6edf3Security_UnspecifiedTb4b4b4,
Te6edf3hlz_marking Tff7b72=
Te6edf3WireCasevacReportTb4b4b4.Te6edf3HlzMarkingTb4b4b4.Te6edf3fromValueTb4b4b4(Te6edf3cTb4b4b4.Te6edf3hlzMarkingTb4b4b4)
Tff7b72?: Te6edf3WireCasevacReportTb4b4b4.Te6edf3HlzMarkingTb4b4b4.Te6edf3HlzMarking_UnspecifiedTb4b4b4,
Te6edf3zone_marker Tff7b72= Te6edf3cTb4b4b4.Te6edf3zoneMarkerTb4b4b4,
Te6edf3us_military Tff7b72= Te6edf3cTb4b4b4.Te6edf3usMilitaryTb4b4b4,
Te6edf3us_civilian Tff7b72= Te6edf3cTb4b4b4.Te6edf3usCivilianTb4b4b4,
Te6edf3non_us_military Tff7b72= Te6edf3cTb4b4b4.Te6edf3nonUsMilitaryTb4b4b4,
Te6edf3non_us_civilian Tff7b72= Te6edf3cTb4b4b4.Te6edf3nonUsCivilianTb4b4b4,
Te6edf3epw Tff7b72= Te6edf3cTb4b4b4.Te6edf3epwTb4b4b4,
Te6edf3child Tff7b72= Te6edf3cTb4b4b4.Te6edf3childTb4b4b4,
Te6edf3terrain_flags Tff7b72= Te6edf3cTb4b4b4.Te6edf3terrainFlagsTb4b4b4,
Te6edf3frequency Tff7b72= Te6edf3cTb4b4b4.Te6edf3frequencyTb4b4b4,
Tb4b4b4)
Tb4b4b4}Tb4b4b4,
Te6edf3emergency Tff7b72=
Tb4b4b4(Te6edf3dataTb4b4b4.Te6edf3payload Tff7b72as? Te6edf3TakPacketV2DataTb4b4b4.Te6edf3PayloadTb4b4b4.Te6edf3EmergencyAlertTb4b4b4)Tff7b72?.Te6edf3let Tb4b4b4{ Te6edf3e Tff7b72-Tff7b72>
Te6edf3WireEmergencyAlertTb4b4b4(
Te6edf3type Tff7b72= Te6edf3WireEmergencyAlertTb4b4b4.Te6edf3TypeTb4b4b4.Te6edf3fromValueTb4b4b4(Te6edf3eTb4b4b4.Te6edf3typeTb4b4b4) Tff7b72?: Te6edf3WireEmergencyAlertTb4b4b4.Te6edf3TypeTb4b4b4.Te6edf3Type_UnspecifiedTb4b4b4,
Te6edf3authoring_uid Tff7b72= Te6edf3eTb4b4b4.Te6edf3authoringUidTb4b4b4,
Te6edf3cancel_reference_uid Tff7b72= Te6edf3eTb4b4b4.Te6edf3cancelReferenceUidTb4b4b4,
Tb4b4b4)
Tb4b4b4}Tb4b4b4,
Te6edf3task Tff7b72=
Tb4b4b4(Te6edf3dataTb4b4b4.Te6edf3payload Tff7b72as? Te6edf3TakPacketV2DataTb4b4b4.Te6edf3PayloadTb4b4b4.Te6edf3TaskRequestTb4b4b4)Tff7b72?.Te6edf3let Tb4b4b4{ Te6edf3t Tff7b72-Tff7b72>
Te6edf3WireTaskRequestTb4b4b4(
Te6edf3task_type Tff7b72= Te6edf3tTb4b4b4.Te6edf3taskTypeTb4b4b4,
Te6edf3target_uid Tff7b72= Te6edf3tTb4b4b4.Te6edf3targetUidTb4b4b4,
Te6edf3assignee_uid Tff7b72= Te6edf3tTb4b4b4.Te6edf3assigneeUidTb4b4b4,
Te6edf3priority Tff7b72=
Te6edf3WireTaskRequestTb4b4b4.Te6edf3PriorityTb4b4b4.Te6edf3fromValueTb4b4b4(Te6edf3tTb4b4b4.Te6edf3priorityTb4b4b4)
Tff7b72?: Te6edf3WireTaskRequestTb4b4b4.Te6edf3PriorityTb4b4b4.Te6edf3Priority_UnspecifiedTb4b4b4,
Te6edf3status Tff7b72=
Te6edf3WireTaskRequestTb4b4b4.Te6edf3StatusTb4b4b4.Te6edf3fromValueTb4b4b4(Te6edf3tTb4b4b4.Te6edf3statusTb4b4b4) Tff7b72?: Te6edf3WireTaskRequestTb4b4b4.Te6edf3StatusTb4b4b4.Te6edf3Status_UnspecifiedTb4b4b4,
Te6edf3note Tff7b72= Te6edf3tTb4b4b4.Te6edf3noteTb4b4b4,
Tb4b4b4)
Tb4b4b4}Tb4b4b4,
Te6edf3raw_detail Tff7b72= Tb4b4b4(Te6edf3dataTb4b4b4.Te6edf3payload Tff7b72as? Te6edf3TakPacketV2DataTb4b4b4.Te6edf3PayloadTb4b4b4.Te6edf3RawDetailTb4b4b4)Tff7b72?.Te6edf3bytesTff7b72?.Te6edf3toByteStringTb4b4b4(Tb4b4b4)Tb4b4b4,
T8b949e// TAKTALK voice/text message (m-t-t). Without this, m-t-t events
T8b949e// would compress with no payload set, the receiver's wireToSdkData
T8b949e// would fall through to Payload.None, and TAKTALK plugin would
T8b949e// never see the rebuilt CoT event for TTS playback.
Te6edf3taktalk Tff7b72=
Tb4b4b4(Te6edf3dataTb4b4b4.Te6edf3payload Tff7b72as? Te6edf3TakPacketV2DataTb4b4b4.Te6edf3PayloadTb4b4b4.Te6edf3TakTalkTb4b4b4)Tff7b72?.Te6edf3let Tb4b4b4{ Te6edf3tt Tff7b72-Tff7b72>
Te6edf3WireTakTalkMessageTb4b4b4(
Te6edf3text Tff7b72= Te6edf3ttTb4b4b4.Te6edf3textTb4b4b4,
Te6edf3chatroom_id Tff7b72= Te6edf3ttTb4b4b4.Te6edf3chatroomIdTb4b4b4,
Te6edf3lang Tff7b72= Te6edf3ttTb4b4b4.Te6edf3langTb4b4b4,
Te6edf3from_voice Tff7b72= Te6edf3ttTb4b4b4.Te6edf3fromVoiceTb4b4b4,
Tb4b4b4)
Tb4b4b4}Tb4b4b4,
T8b949e// TAKTALK room/membership broadcast (y-). Required for receivers
T8b949e// to resolve TAKTALK room UUIDs to friendly names + rosters.
Te6edf3taktalk_room Tff7b72=
Tb4b4b4(Te6edf3dataTb4b4b4.Te6edf3payload Tff7b72as? Te6edf3TakPacketV2DataTb4b4b4.Te6edf3PayloadTb4b4b4.Te6edf3TakTalkRoomTb4b4b4)Tff7b72?.Te6edf3let Tb4b4b4{ Te6edf3room Tff7b72-Tff7b72>
Tf0883e@SuppressTb4b4b4(Ta5d6ff"Ta5d6ffDEPRECATIONTa5d6ff"Tb4b4b4)
Te6edf3WireTakTalkRoomDataTb4b4b4(
T8b949e// sender_callsign deprecated in SDK v0.3.2 β€” the SDK
T8b949e// builder reconstitutes <sender-callsign> from envelope
T8b949e// packet.callsign, so we stop emitting the duplicate
T8b949e// wire byte. Field stays present for one release so
T8b949e// v0.3.1 receivers continue decoding cleanly.
Te6edf3sender_callsign Tff7b72= Ta5d6ff"Ta5d6ff"Tb4b4b4,
Te6edf3room_id Tff7b72= Te6edf3roomTb4b4b4.Te6edf3roomIdTb4b4b4,
Te6edf3room_name Tff7b72= Te6edf3roomTb4b4b4.Te6edf3roomNameTb4b4b4,
Te6edf3participants Tff7b72= Te6edf3roomTb4b4b4.Te6edf3participantsTb4b4b4.Te6edf3toListTb4b4b4(Tb4b4b4)Tb4b4b4,
Tb4b4b4)
Tb4b4b4}Tb4b4b4,
T8b949e// Directed-routing recipient list (<marti><dest …/>…</marti>).
T8b949e// Empty list = broadcast (default); populated for TAKTALK m-t-t
T8b949e// and directed b-t-f DMs. Encode an explicit Marti only when
T8b949e// there is at least one destination β€” the wrapper costs wire
T8b949e// bytes for no benefit on broadcast packets.
Te6edf3marti Tff7b72= Te6edf3dataTb4b4b4.Te6edf3martiTb4b4b4.Te6edf3takeIf Tb4b4b4{ Tffa657itTb4b4b4.Te6edf3isNotEmptyTb4b4b4(Tb4b4b4) Tb4b4b4}Tff7b72?.Te6edf3let Tb4b4b4{ Te6edf3orgTb4b4b4.Te6edf3meshtasticTb4b4b4.Te6edf3protoTb4b4b4.Te6edf3MartiTb4b4b4(Te6edf3dest_callsign Tff7b72= Tffa657itTb4b4b4) Tb4b4b4}Tb4b4b4,
Tb4b4b4)
Tb4b4b4}
Tb4b4b4}

Served by rngit 1.5.0 - Generated in 0.14s